/* eslint-disable @typescript-eslint/no-var-requires */
const fs = require('fs')
const path = require('path')
const readline = require('readline')
import chalk from 'chalk'

// 创建一个读取输入的接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
})

// 复制模板文件到新目录
function copyDirectory(source: string, destination: string, packageName: string) {
  // 创建目标目录
  if (!fs.existsSync(destination)) {
    fs.mkdirSync(destination, { recursive: true })
  }

  // 读取源目录的所有文件和子目录
  const files = fs.readdirSync(source)

  files.forEach((file: string) => {
    const sourcePath = path.join(source, file)
    const destPath = path.join(destination, file)

    if (fs.lstatSync(sourcePath).isDirectory()) {
      // 如果是目录，递归复制
      copyDirectory(sourcePath, destPath, packageName)
    } else {
      // 如果是文件，复制并检查是否需要替换占位符
      fs.copyFileSync(sourcePath, destPath)

      // 如果是 index.html 文件，进行占位符替换
      if (file === 'index.html') {
        let htmlContent = fs.readFileSync(destPath, 'utf8')
        htmlContent = htmlContent.replace(
          '<title>template</title>',
          `<title>${packageName}</title>`
        )
        fs.writeFileSync(destPath, htmlContent, 'utf8')
        console.log(chalk.green(`替换 ${file} 中的包名成功！`))
      }
    }
  })
}

// 获取用户输入的包名
rl.question('请输入新的包名: ', (packageName: any) => {
  // 定义路径
  const packagesDir = path.join(__dirname, '../packages') // packages 根目录
  const templateDir = path.join(packagesDir, 'template') // 模板目录路径
  const newPackageDir = path.join(packagesDir, packageName) // 新包文件夹路径
  const templatePackageJson = path.join(templateDir, 'package.json') // 模板 package.json 路径
  const newPackageJson = path.join(newPackageDir, 'package.json') // 新包的 package.json 路径

  // 检查新包文件夹是否已存在
  if (fs.existsSync(newPackageDir)) {
    console.log(chalk.red(`目录 ${newPackageDir} 已存在！无法创建新包。`)) // 红色提示
    rl.close()
    return
  }

  // 创建新的包目录
  fs.mkdirSync(newPackageDir, { recursive: true })
  console.log(chalk.green(`创建目录 ${newPackageDir} 成功！`)) // 绿色提示

  // 复制模板目录到新目录
  copyDirectory(templateDir, newPackageDir, packageName)
  console.log(chalk.green(`复制模板文件到 ${newPackageDir} 成功！`))

  // 替换 package.json 中的占位符
  if (fs.existsSync(templatePackageJson)) {
    let packageJsonContent = fs.readFileSync(templatePackageJson, 'utf8')
    packageJsonContent = packageJsonContent.replace(
      '"name": "template"',
      `"name": "${packageName}"`
    )

    // 写入新的 package.json
    fs.writeFileSync(newPackageJson, packageJsonContent, 'utf8')
    console.log(chalk.green(`替换 ${newPackageJson} 中的包名成功！`))
  }

  rl.close()
})
